package com.cdream.basic.algorithm.leetcode.string;

/**
 * @author cdream
 * @date 6/17/21
 */
public class Question65 {
    public static void main(String[] args) {
        System.out.println(new Question65().isNumber("0"));
    }
    public boolean isNumber(String s) {
        int eIndex = -1;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == 'e' || s.charAt(i) == 'E') {
                if (eIndex != -1) {
                    return false;
                } else {
                    eIndex = i;
                }
            }
        }
        boolean res = true;
        if (eIndex == -1) {
            res = checkNum(s, 0, s.length() - 1, false);
        } else {
            res = checkNum(s, 0, eIndex - 1, false);
            res &= checkNum(s, eIndex + 1, s.length() - 1, true);
        }

        return res;
    }

    private boolean checkNum(String s, int start, int end, boolean mustInteger) {
        if (start > end) {
            return false;
        }
        if (s.charAt(start) == '+' || s.charAt(start) == '-') {
            start++;
        }
        boolean hasNum = false, hasDot = false;
        for (int i = start; i <= end; i++) {
            char c = s.charAt(i);
            if (c == '.') {
                if (mustInteger) {
                    return false;
                }
                if (hasDot) {
                    return false;
                } else {
                    hasDot = true;
                }
            } else if (c >= '0' && c<='9') {
                hasNum = true;
            } else {
                return false;
            }
        }

        return hasNum;
    }

    enum State {
        /**
         * 初始状态
         */
        STATE_INITIAL,
        /**
         * 符号位
         */
        STATE_INT_SIGN,
        /**
         * 整数部分
         */
        STATE_INTEGER,
        /**
         * 小数点左有整数
         */
        STATE_POINT,
        /**
         * 小数点左无整数
         */
        STATE_POINT_WITHOUT_INT,
        /**
         * 小数部分
         */
        STATE_FRACTION,
        /**
         * 字符e
         */
        STATE_EXP,
        /**
         * 指数的符号
         */
        STATE_EXP_SIGN,
        /**
         * 指数数字
         */
        STATE_EXP_NUMBER,
        /**
         * 输出
         */
        STATE_END
    }

    enum CharType {
        /**
         * 数字
         */
        CHAR_NUMBER,
        /**
         * 大小e
         */
        CHAR_EXP,
        /**
         * 小数点
         */
        CHAR_POINT,
        /**
         * 正负号
         */
        CHAR_SIGN,
        /**
         * 非法字符
         */
        CHAR_ILLEGAL
    }
}
